////////////////////////////////////////////////////////////////////
// Programme de conversion de TIM sans palette de Chrono Cross
////////////////////////////////////////////////////////////////////

////////////////////////////////////////////////////////////////////
// Nemesis pour Terminus Traduction (tt_nemesis@yahoo.fr)
// Date de création :		25/07/04
// Dernière modification :	25/07/04
////////////////////////////////////////////////////////////////////

// Entete
#include "Raw.h"

// Constantes des RAW (4bits/pixel,8bits/pixel)
#define RAW_LARGHAUT	16
#define RAW_DONNEES		20

// Constantes des palettes
#define PAL_COULEURS	256
#define PAL_COMP		4

// Constantes des BMP
#define BMP_TAILLE		2
#define BMP_LARGHAUT	18
#define BMP_PALETTE		54
#define BMP_DONNEES		1078


// Entete des BMP 4bit/pixel avec palette
// les 0xFF marque les zones variables
unsigned _int8 BMP_ENTETE_8[] = {
	0x42,0x4D,				// Type de fichier (BM)
	0xFF,0xFF,0xFF,0xFF,	// Taille en octets du fichier
	0x00,0x00,0x00,0x00,	// Rien
	0x36,0x04,0x00,0x00,	// Offset de l'image (118 ou 1078)
	0x28,0x00,0x00,0x00,	// Taille de l'entête (40)
	0xFF,0xFF,0xFF,0xFF,	// Largeur
	0xFF,0xFF,0xFF,0xFF,	// Hauteur
	0x01,0x00,				// Nombre de plans (1)
	0x08,0x00,				// Nombre de bits/pixel (4 ou 8)
	0x00,0x00,0x00,0x00,	// Compression (aucune)
	0x00,0x00,0x00,0x00,	// Taille de l'image (inutile)
	0x00,0x00,0x00,0x00,	// Résolution horizontale
	0x00,0x00,0x00,0x00,	// Résolution verticale
	0x00,0x00,0x00,0x00,	// Couleurs (palette entière)
	0x00,0x00,0x00,0x00,	// Couleurs principales (aucune)
};

/*------------------------------------------------------------------
  Conversion TIM sans palette -> BMP d'un fichier
--------------------------------------------------------------------
 <- entree : room, fichier, palette et masque du TIM à convertir
------------------------------------------------------------------*/
void Raw_to_Bmp (char* entree)
{
	// Eléments et dossier
	int room;
	char *fich;
	int pal;
	int mask;
	// Dossier complet
	char dossier_complet[RAW_NOM_MAX];
	// Fichier palette
	FILE *pal_f;
	// Fichier Tim à convertir
	FILE *tim_f;
	// Fichier Bmp en sortie
	FILE *bmp_f;
	// Nom du fichier (chemin)
	char *fichier;
	char fich_complet[RAW_NOM_MAX];
	char fich_suff[RAW_NOM_MAX];
	// Variables temporaires
	_int32 temp;
	// Propriétés de l'image
	unsigned _int16 hauteur,largeur;
	unsigned _int32 taille,tim_taille;
	// Palette de couleur
	unsigned _int16 couleur;
	unsigned _int8 composantes[PAL_COMP];
	int c;
	// Donnees
	unsigned _int8 o;
	_int32 l,i;

	Main_Message_S("Conversion TIM(sans palette)->BMP de %s... ",entree,OK);

	// Décomposition dossier/fichiers/palette/masque
	room=atoi(strtok(entree,SEPARATEUR));
	fich=strtok(NULL,SEPARATEUR);
	pal=atoi(strtok(NULL,SEPARATEUR));
	mask=atoi(strtok(NULL,SEPARATEUR));

	// Recherche du fichier TIM
	sprintf(dossier_complet,"%s%s%04d\\",DIR_FICH_IN,ENT_DOSSIER,room);
	Fichier_Cherche(dossier_complet,fich,EXT_TIM,&fichier);
	// Ouverture du fichier TIM
	sprintf(fich_complet,"%s%s",dossier_complet,fichier);
	tim_f=fopen(fich_complet,"rb");

	// Fichier existant ?
	if (tim_f==NULL)
		Main_Message_S("Impossible d'ouvrir le fichier.\n","",ER);
	else {
		// Ouverture du fichier BMP de sortie
		sprintf(fich_suff,"_%02d.%s",pal,EXT_BMP);
		strcpy(&fich_complet[strlen(fich_complet)-4],fich_suff);
		bmp_f=fopen(fich_complet,"wb");
		// Ecriture de l'entête
		fwrite(BMP_ENTETE_8,sizeof(BMP_ENTETE_8),1,bmp_f);
		fclose(bmp_f);
		// Réouverture pour modifications
		bmp_f=fopen(fich_complet,"r+b");
		// Récupération de la largeur
		fseek(tim_f,RAW_LARGHAUT,SEEK_SET);
		fseek(bmp_f,BMP_LARGHAUT,SEEK_SET);
		fread(&largeur,sizeof(_int16),1,tim_f);
		largeur*=2;
		temp=largeur;
		fwrite(&temp,sizeof(_int32),1,bmp_f);
		// Récupération de la hauteur
		fread(&hauteur,sizeof(_int16),1,tim_f);
		temp=hauteur;
		fwrite(&temp,sizeof(_int32),1,bmp_f);

		// Recherche de la palette
		sprintf(dossier_complet,"%s%s%04d\\",DIR_FICH_IN,ENT_DOSSIER,room-2);
		Fichier_Cherche(dossier_complet,RAW_PAL_FICH,NULL,&fichier);
		// Ouverture de la palette
		sprintf(fich_complet,"%s%s",dossier_complet,fichier);
		pal_f=fopen(fich_complet,"rb");
		// Alignement dans la palette
		fseek(pal_f,sizeof(short)*PAL_COULEURS*pal,SEEK_SET);
		// Récupération et conversion de la palette
		fseek(bmp_f,BMP_PALETTE,SEEK_SET);
		composantes[3]=0x00;
		for(c=0;c<PAL_COULEURS;c++) {
			fread(&couleur,sizeof(_int16),1,pal_f);
			// Couleur de masquage ? Neutre pour la réconversion
			if (c!=mask) {
				composantes[0]=8*(couleur>>10);			// Bleu
				composantes[1]=8*((couleur>>5) & 0x1F);	// Vert
				composantes[2]=8*(couleur & 0x1F);		// Rouge
			} else {
				// Couleur théoiquement impossible à obtenir
				// car de composantes non multiples de 8
				composantes[0]=255;		// Bleu
				composantes[1]=0;		// Vert
				composantes[2]=255;		// Rouge
			}
			fwrite(&composantes,sizeof(_int8),PAL_COMP,bmp_f);
		}

		// Taille de l'image
		fseek(bmp_f,BMP_TAILLE,SEEK_SET);
		taille=largeur*hauteur+BMP_DONNEES;
		fwrite(&taille,sizeof(_int32),1,bmp_f);
		// Taille réelle du fichier RAW
		fseek(tim_f,0L,SEEK_END);
		tim_taille=ftell(tim_f);
		// Copie des données
		fseek(bmp_f,BMP_DONNEES,SEEK_SET);
		for(l=hauteur-1;l>=0;l--) {
			fseek(tim_f,RAW_DONNEES+l*largeur,SEEK_SET);
			for(i=0;i<largeur;i++) {
				o=fgetc(tim_f);
				fputc(o,bmp_f);
			}
			// Imposé par le format BMP
			// largeur en octets=multiple de 4
			for(i=0;i<(4-largeur%4)%4;i++)
				fputc(0,bmp_f);
		}
		// Fermeture des fichiers
		fclose(bmp_f);
		fclose(tim_f);
	}

	Main_OK();
}

/*------------------------------------------------------------------
  Conversion BMP -> TIM sans palette d'un fichier
--------------------------------------------------------------------
 <- entree : room, fichier, palette et masque du TIM à régénérer
------------------------------------------------------------------*/
void Bmp_to_Raw (char* entree)
{
	// Eléments et dossier
	int room;
	char *fich;
	int pal;
	int mask;
	// Dossier complet
	char dossier_complet[RAW_NOM_MAX];
	// Fichier Tim
	FILE *tim_f;
	// Fichier Bmp à convertir
	FILE *bmp_f;
	// Nom du fichier (chemin)
	char fich_complet[RAW_NOM_MAX];
	char fich_suff[RAW_NOM_MAX];
	char *fichier;
	// Propriétés de l'image
	unsigned short hauteur;
	unsigned short largeur;
	// Donnees
	unsigned char o;
	int l,i;

	Main_Message_S("Conversion BMP->TIM(sans palette) de %s... ",entree,OK);

	// Décomposition dossier/fichiers/palette/masque
	room=atoi(strtok(entree,SEPARATEUR));
	fich=strtok(NULL,SEPARATEUR);
	// La palette n'est pas utilisée dans la version actuelle
	pal=atoi(strtok(NULL,SEPARATEUR));
	mask=atoi(strtok(NULL,SEPARATEUR));

	// Recherche du fichier TIM de base
	sprintf(dossier_complet,"%s%s%04d\\",DIR_FICH_OUT,ENT_DOSSIER,room);
	Fichier_Cherche(dossier_complet,fich,EXT_TIM,&fichier);
	// Ouverture du fichier TIM
	sprintf(fich_complet,"%s%s",dossier_complet,fichier);
	tim_f=fopen(fich_complet,"r+b");

	// Recherche du fichier BMP
	sprintf(dossier_complet,"%s%s%04d\\",DIR_FICH_OUT,ENT_DOSSIER,room);
	sprintf(fich_suff,"%s*_%02d",fich,pal);
	Fichier_Cherche(dossier_complet,fich_suff,EXT_BMP,&fichier);
	// Ouverture du fichier BMP
	sprintf(fich_complet,"%s%s",dossier_complet,fichier);
	bmp_f=fopen(fich_complet,"rb");

	// Fichiers existants ?
	if (bmp_f==NULL || tim_f==NULL)
		Main_Message_S("Impossible d'ouvrir le fichier.\n","",ER);
	else {
		// Saut de l'entête
		fseek(tim_f,RAW_LARGHAUT,SEEK_SET);
		// Récupération de la largeur
		fread(&largeur,sizeof(short),1,tim_f);
		largeur*=2;
		// Récupération de la hauteur
		fread(&hauteur,sizeof(short),1,tim_f);
		// Copie des données
		fseek(tim_f,RAW_DONNEES,SEEK_SET);
		for(l=hauteur-1;l>=0;l--) {
			fseek(bmp_f,BMP_DONNEES+l*largeur,SEEK_SET);
			for(i=0;i<largeur;i++) {
				o=fgetc(bmp_f);
				// Octet d'origine
				if (o==mask)
					fseek(tim_f,1,SEEK_CUR);
				else
					fputc(o,tim_f);
			}
		}
		// Fermeture des fichiers
		fclose(bmp_f);
		fclose(tim_f);
	}

	Main_OK();
}